let someValue: any = "this is a string";

// 尖括号语法
// let strLength: number = (<string>someValue).length;

// as 语法
// let strLength: number = (someValue as string).length;

/**
 * ts 不光有基础的类型，还对常见的 DOM对象 事件对象 全局对象 都提供的 类型声明文件(.d.ts)
 */
const el = document.getElementById("app") as HTMLElement;

// el?.innerHTM

// 非空断言 !
//    排除掉 null 与 undefined
function myFunc(maybeString: string | null | undefined) {
  const str: string = maybeString; // 不能将类型“string | null | undefined”分配给类型“string”。不能将类型“undefined”分配给类型“string”
  const str1: string = maybeString!; // OK

  console.log(str);
  console.log(str1);
}

type CallbackType = () => number;

function myFunc1(callback: CallbackType | undefined) {
  const num1 = callback(); // Error 不能调用可能是“未定义”的对象。
  const num2 = callback!(); // Ok
}
